import { Table } from './interface'


/**
 * 自定义表格hook
 *
 * @param api 可选的API函数，用于获取表格数据。函数接受一个参数params，返回一个Promise对象，Promise解析后得到的数据将作为表格的数据源。
 * @param initParam 初始请求参数，默认为空对象。
 * @param isPageable 是否分页，默认为true。如果为true，则表格会按分页方式处理数据；如果为false，则一次性加载所有数据。
 * @param dataCallBack 可选的数据处理回调函数，函数接受一个参数data，表示从API返回的数据，可以在这里对返回的数据进行自定义处理。
 * @param requestError 可选的请求错误处理回调函数，函数接受一个参数error，表示请求过程中发生的错误。
 * @returns 返回一个包含表格相关状态和方法的对象。
 */
export const useTable = (
    api?: (params: any) => Promise<any>,
    initParam: object = {},
    isPageable: boolean = true,
    dataCallBack?: (data: any) => any,
    requestError?: (error: any) => void
) => {
    const state = reactive<Table.StateProps>({
        // 表格数据
        tableData: [],
        pageInfo: {
            // 当前页数
            curPage: 1,
            // 每页显示条数
            pageSize: 10,
            // 总条数
            total: 0,
        },
        // 查询参数(只包括查询)
        searchParam: {},
        // 初始化默认的查询参数
        searchInitParam: {},
        // 总参数(包含分页和查询参数)
        totalParam: {}
    })

    const pageParam = computed({
        get: () => {
            return {
                curPage: state.pageInfo.curPage,
                pageSize: state.pageInfo.pageSize,
            }
        },
        set: (newVal: any) => {
            console.log("newVal", newVal);
        }
    })

    /**
      * @description 获取表格数据
      * @return void
      */
    const getTableList = async () => {
        if (!api) return
        try {
            Object.assign(state.totalParam, initParam, isPageable ? pageParam.value : {})
            let { data } = await api({ ...state.searchInitParam, ...state.totalParam })
            dataCallBack && (data = dataCallBack(data))
            state.tableData = isPageable ? data.list : data;
            if (isPageable) {
                const { curPage, pageSize, total } = data;
                updatePageInfo({ curPage, pageSize, total });
            }
        } catch (error) {
            requestError && requestError(error);
        }
    }

    /**
     * @description 更新查询参数
     * @return void
     * */
    const updatedTotalParam = () => {
        state.totalParam = {};
        let newSearchParam: Table.StateProps["searchParam"] = {};
        for (let key in state.searchParam) {
            // 某些情况下参数为 false/0 也应该携带参数
            if (state.searchParam[key] || state.searchParam[key] === false || state.searchParam[key] === 0) {
                newSearchParam[key] = state.searchParam[key];
            }
        }
        Object.assign(state.totalParam, newSearchParam, isPageable ? pageParam.value : {});
    }

    /**
     * 更新分页信息
     *
     * @param pageInfo 分页信息，来源于Table.PageType枚举
     * */
    const updatePageInfo = (pageInfo: Table.PageType) => {
        Object.assign(state.pageInfo, pageInfo);
    };

    /**
      * @description 表格数据查询
      * @return void
      * */
    const search = () => {
        state.pageInfo.curPage = 1;
        updatedTotalParam();
        getTableList();
    };

    /**
     * @description 表格数据重置
     * @return void
     * */
    const reset = () => {
        state.pageInfo.curPage = 1;
        // 重置搜索表单的时，如果有默认搜索参数，则重置默认的搜索参数
        state.searchParam = { ...state.searchInitParam };
        updatedTotalParam();
        getTableList();
    };

    /**
     * @description 每页条数改变
     * @param {Number} val 当前条数
     * @return void
     * */
    const handleSizeChange = (val: number) => {
        state.pageInfo.curPage = 1;
        state.pageInfo.pageSize = val;
        getTableList();
    };


    /**
     * @description 当前页改变
     * @param {Number} val 当前页
     * @return void
     * */
    const handleCurrentChange = (val: number) => {
        state.pageInfo.curPage = val;
        getTableList();
    };

    return {
        ...toRefs(state),
        getTableList,
        search,
        reset,
        handleSizeChange,
        handleCurrentChange,
        updatedTotalParam
    };
}